﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using CAGFIP.Edicao;
using CAGFIP.Utils;

namespace CAGFIP.GUI
{
    public partial class CRUD_teste : Form
    {
        //TODO: mover a maior parte do conteudo para ControladorEdicao
        private enum EdicaoStatus
        {
            None,
            Add,
            Update
        }

        #region Fields

        private EdicaoStatus perguntaEdicaoStatus;
        private EdicaoStatus assuntoEdicaoStatus;

        #endregion

        #region Constructors

        public CRUD_teste()
        {
            InitializeComponent();
        }

        #endregion

        #region Properties

        private EdicaoStatus PerguntaEdicaoStatus
        {
            get { return this.perguntaEdicaoStatus; }
            set
            {
                switch (value)
                {
                    case EdicaoStatus.Add:
                        ConfigurePerguntaAdd();
                        BeginPerguntaEdit();
                        break;
                    case EdicaoStatus.Update:
                        BeginPerguntaEdit();
                        break;
                    case EdicaoStatus.None:
                        EndPerguntaEdit();
                        break;
                    default:
                        throw new NotImplementedException();
                }
                this.perguntaEdicaoStatus = value;
            }
        }
        private EdicaoStatus AssuntoEdicaoStatus
        {
            get { return this.assuntoEdicaoStatus; }
            set
            {
                switch (value)
                {
                    case EdicaoStatus.Add:
                        ConfigureAssuntoAdd();
                        BeginAssuntoEdit();
                        break;
                    case EdicaoStatus.Update:
                        BeginAssuntoEdit();
                        break;
                    case EdicaoStatus.None:
                        EndAssuntoEdit();
                        break;
                    default:
                        throw new NotImplementedException();
                }
                this.assuntoEdicaoStatus = value;
            }
        }

        #endregion

        internal void Configure(List<Pergunta> perguntas, List<Assunto> assuntos)
        {
            //datasources
            SetPerguntaDataSource(perguntas);
            SetAssuntoDataSource(assuntos);

            //status
            PerguntaEdicaoStatus = AssuntoEdicaoStatus = EdicaoStatus.None;
        }

        #region TODO: remover isso...

        private void label4_Click(object sender, EventArgs e)
        {

        }

        private void splitContainer2_Panel2_Paint(object sender, PaintEventArgs e)
        {

        }

        private void splitContainer2_Panel1_Paint(object sender, PaintEventArgs e)
        {

        }

        private void splitContainer3_Panel1_Paint(object sender, PaintEventArgs e)
        {

        }

        private void AssuntoGroupBox_Enter(object sender, EventArgs e)
        {

        }

        private void splitContainer5_Panel2_Paint(object sender, PaintEventArgs e)
        {

        }

        private void splitContainer4_Panel2_Paint(object sender, PaintEventArgs e)
        {

        }
        #endregion

        private void PerguntaListBox_SelectedValueChanged(object sender, EventArgs e)
        {
            PerguntaEdicaoStatus = EdicaoStatus.None;

            var pergunta = (Pergunta)this.PerguntaListBox.SelectedItem;
            if (pergunta == null)
            {
                this.EnunciadoTextBox.Text = this.AltCorretaTextBox.Text =
                    this.AltIncorreta1TextBox.Text = this.AltIncorreta2TextBox.Text =
                    this.AltIncorreta3TextBox.Text = this.AltIncorreta4TextBox.Text = String.Empty;

                this.AssuntoPerguntaComboBox.SelectedIndex = -1; //deseleciona

                this.RemoverPerguntaButton.Enabled = false;
            }
            else
            {
                this.EnunciadoTextBox.Text = pergunta.Enunciado;
                this.AltCorretaTextBox.Text = pergunta.AlternativaCorreta;
                this.AltIncorreta1TextBox.Text = pergunta.AlterntivasIncorretas[0];
                this.AltIncorreta2TextBox.Text = pergunta.AlterntivasIncorretas[1];
                this.AltIncorreta3TextBox.Text = pergunta.AlterntivasIncorretas[2];
                this.AltIncorreta4TextBox.Text = pergunta.AlterntivasIncorretas[3];

                this.AssuntoPerguntaComboBox.SelectedValue = pergunta.IdAssunto;

                this.RemoverPerguntaButton.Enabled = true;
            }
        }

        private void AssuntoListBox_SelectedValueChanged(object sender, EventArgs e)
        {
            AssuntoEdicaoStatus = EdicaoStatus.None;

            var assunto = (Assunto)this.AssuntoListBox.SelectedItem;
            if (assunto == null)
            {
                this.NomeAssuntoTextBox.Text = this.DescricaoAssuntoTextBox.Text = String.Empty;

                this.RemoverAssuntoButton.Enabled = false;
            }
            else
            {
                this.NomeAssuntoTextBox.Text = assunto.Nome;
                this.DescricaoAssuntoTextBox.Text = assunto.Descricao;

                this.RemoverAssuntoButton.Enabled = true;
            }
        }

        private void AdicionarPerguntaButton_Click(object sender, EventArgs e)
        {
            PerguntaEdicaoStatus = EdicaoStatus.Add;
        }
        private void EditarPerguntaButton_Click(object sender, EventArgs e)
        {
            PerguntaEdicaoStatus = EdicaoStatus.Update;
        }
        private void AdicionarAssuntoButton_Click(object sender, EventArgs e)
        {
            AssuntoEdicaoStatus = EdicaoStatus.Add;
        }
        private void EditarAssuntoButton_Click(object sender, EventArgs e)
        {
            AssuntoEdicaoStatus = EdicaoStatus.Update;
        }

        private void RemoverPerguntaButton_Click(object sender, EventArgs e)
        {
            var answer = MessageBox.Show("Tem certeza de que deseja remover a pergunta selecionada?",
                "Remoção de Pergunta",
                MessageBoxButtons.YesNo);

            if (answer != System.Windows.Forms.DialogResult.Yes) return;

            //params
            var selPergunta = (Pergunta)this.PerguntaListBox.SelectedItem;
            int selPerguntaIdx = this.PerguntaListBox.SelectedIndex;

            //listbox
            var allPerguntas = (List<Pergunta>)this.PerguntaListBox.DataSource;
            allPerguntas.Remove(selPergunta);

            RefreshPerguntaDataSource(allPerguntas);

            //db
            ControladorEdicao.PerguntaDAO.RemoverPergunta(selPergunta.Id);
        }
        private void RemoverAssuntoButton_Click(object sender, EventArgs e)
        {
            var selAssunto = (Assunto)this.AssuntoListBox.SelectedItem;
            
            var allPerguntas = (List<Pergunta>)this.PerguntaListBox.DataSource;
            if (allPerguntas.FindIndex(delegate(Pergunta predicate)
            {
                return predicate.Id == selAssunto.Id;
            }) != -1)
            {
                MessageBox.Show("Não é possível remover assunto que está relacionado com uma pergunta.\nImpossível continuar",
                    "Remoção de Assunto", MessageBoxButtons.OK);
                return;
            }

            var answer = MessageBox.Show("Tem certeza de que deseja remover o assunto selecionado?",
                "Remoção de Assunto",
                MessageBoxButtons.YesNo);

            if (answer != System.Windows.Forms.DialogResult.Yes) return;

            //listbox
            var allAssuntos = (List<Assunto>)this.AssuntoListBox.DataSource;
            allAssuntos.Remove(selAssunto);

            RefreshAssuntoDataSource(allAssuntos);

            //db
            ControladorEdicao.AssuntoDAO.RemoverAssunto(selAssunto.Id);
        }

        private void SalvarPerguntaButton_Click(object sender, EventArgs e)
        {
            if (PerguntaEdicaoStatus == EdicaoStatus.Update)
            {
                var answer = MessageBox.Show("Tem certeza de que deseja alterar a pergunta selecionada?",
                    "Alteração de Pergunta",
                    MessageBoxButtons.YesNo);
                if (answer != System.Windows.Forms.DialogResult.Yes) return;
            }

            var allPerguntas = (List<Pergunta>)this.PerguntaListBox.DataSource;

            var newPergunta = new Pergunta((int)this.AssuntoPerguntaComboBox.SelectedValue,
                    this.EnunciadoTextBox.Text,
                    this.AltCorretaTextBox.Text,
                    new string[] { this.AltIncorreta1TextBox.Text,
                            this.AltIncorreta2TextBox.Text,
                            this.AltIncorreta3TextBox.Text,
                            this.AltIncorreta4TextBox.Text
                        });

            if (PerguntaEdicaoStatus == EdicaoStatus.Add)
            {
                //listbox
                allPerguntas.Add(newPergunta);

                //db
                ControladorEdicao.PerguntaDAO.CadastrarPergunta(newPergunta);
            }
            else if (PerguntaEdicaoStatus == EdicaoStatus.Update)
            {
                int oldPerguntaIdx = this.PerguntaListBox.SelectedIndex;
                var oldPergunta = (Pergunta)this.PerguntaListBox.SelectedItem;

                newPergunta.Id = oldPergunta.Id;

                //listbox
                allPerguntas[oldPerguntaIdx] = newPergunta;

                //db
                ControladorEdicao.PerguntaDAO.AlterarPergunta(newPergunta);
            }

            RefreshPerguntaDataSource(allPerguntas);
            PerguntaEdicaoStatus = EdicaoStatus.None;
        }

        private void SalvarAssuntoButton_Click(object sender, EventArgs e)
        {

            if (AssuntoEdicaoStatus == EdicaoStatus.Update)
            {
                var answer = MessageBox.Show("Tem certeza de que deseja alterar o assunto selecionado?",
                    "Alteração de Assunto",
                    MessageBoxButtons.YesNo);
                if (answer != System.Windows.Forms.DialogResult.Yes) return;
            }

            var allAssuntos = (List<Assunto>)this.AssuntoListBox.DataSource;

            var newAssunto = new Assunto(this.NomeAssuntoTextBox.Text,
                this.DescricaoAssuntoTextBox.Text);

            if (AssuntoEdicaoStatus == EdicaoStatus.Add)
            {
                //listbox
                allAssuntos.Add(newAssunto);

                //db
                ControladorEdicao.AssuntoDAO.CadastrarAssunto(newAssunto);
            }
            else if (AssuntoEdicaoStatus == EdicaoStatus.Update)
            {
                int oldAssuntoIdx = this.AssuntoListBox.SelectedIndex;
                var oldAssunto = (Assunto)this.AssuntoListBox.SelectedItem;

                newAssunto.Id = oldAssunto.Id;

                //listbox
                allAssuntos[oldAssuntoIdx] = newAssunto;

                //db
                ControladorEdicao.AssuntoDAO.AlterarAssunto(newAssunto);
            }

            RefreshAssuntoDataSource(allAssuntos);
            AssuntoEdicaoStatus = EdicaoStatus.None;
        }

        private void BeginPerguntaEdit()
        {
            this.EnunciadoTextBox.Enabled = this.AltCorretaTextBox.Enabled =
                this.AltIncorreta1TextBox.Enabled = this.AltIncorreta2TextBox.Enabled =
                this.AltIncorreta3TextBox.Enabled = this.AltIncorreta4TextBox.Enabled = true;

            this.AssuntoPerguntaComboBox.Enabled = true;
            this.SalvarPerguntaButton.Enabled = true;

        }
        private void EndPerguntaEdit()
        {
            this.EnunciadoTextBox.Enabled = this.AltCorretaTextBox.Enabled =
                this.AltIncorreta1TextBox.Enabled = this.AltIncorreta2TextBox.Enabled =
                this.AltIncorreta3TextBox.Enabled = this.AltIncorreta4TextBox.Enabled = false;

            this.AdicionarPerguntaButton.Enabled = true;

            this.AssuntoPerguntaComboBox.Enabled = false;
            this.SalvarPerguntaButton.Enabled = false;
        }
        private void BeginAssuntoEdit()
        {
            this.NomeAssuntoTextBox.Enabled = this.DescricaoAssuntoTextBox.Enabled = true;

            this.SalvarAssuntoButton.Enabled = true;
        }
        private void EndAssuntoEdit()
        {
            this.NomeAssuntoTextBox.Enabled = this.DescricaoAssuntoTextBox.Enabled = false;

            this.AdicionarAssuntoButton.Enabled = true;
            
            this.SalvarAssuntoButton.Enabled = false;
        }

        private void ConfigureAssuntoAdd()
        {
            this.NomeAssuntoTextBox.Text = this.DescricaoAssuntoTextBox.Text = "(Insira seu texto aqui)";

            this.AdicionarAssuntoButton.Enabled = false;
        }

        private void ConfigurePerguntaAdd()
        {
            this.EnunciadoTextBox.Text = this.AltCorretaTextBox.Text =
                this.AltIncorreta1TextBox.Text = this.AltIncorreta2TextBox.Text =
                this.AltIncorreta3TextBox.Text = this.AltIncorreta4TextBox.Text = "(Insira seu texto aqui)";

            this.AdicionarPerguntaButton.Enabled = false;
        }

        private void SetPerguntaDataSource(List<Pergunta> dataSource)
        {
            this.PerguntaListBox.DataSource = dataSource;
            this.PerguntaListBox.DisplayMember = "enunciado";
            this.PerguntaListBox.ValueMember = "id";
        }
        private void RefreshPerguntaDataSource(List<Pergunta> dataSource)
        {
            //usar BindingList nao funciona como esperado
            this.PerguntaListBox.DataSource = null;
            SetPerguntaDataSource(dataSource);
        }

        private void SetAssuntoDataSource(List<Assunto> assuntos)
        {
            this.AssuntoPerguntaComboBox.DataSource = assuntos;
            this.AssuntoPerguntaComboBox.DisplayMember = "nome";
            this.AssuntoPerguntaComboBox.ValueMember = "id";

            this.AssuntoListBox.DataSource = assuntos;
            this.AssuntoListBox.DisplayMember = "nome";
            this.AssuntoListBox.ValueMember = "id";
        }
        private void RefreshAssuntoDataSource(List<Assunto> dataSource)
        {
            //usar BindingList nao funciona como esperado
            this.AssuntoPerguntaComboBox.DataSource = null;
            this.AssuntoListBox.DataSource = null;

            SetAssuntoDataSource(dataSource);
        }

        private void VoltarButton_Click(object sender, EventArgs e)
        {
            this.Hide();
            ControladorGUI.Instance.ExibirMenuInicial();
        }

        private void CRUD_teste_FormClosed(object sender, FormClosedEventArgs e)
        {
            ControladorGUI.Instance.Exit();
        }
    }
}
